﻿using System;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Drawing.Printing;
using System.Collections;
namespace System2012
{
    public class GUtil
    {
        public DateTime AumentarMeses(DateTime fechaInicio, int meses)
        {
            DateTime fechaFin = DateTime.Today.AddMonths(meses);
            return fechaFin;
        }

        public DateTime AumentardDias(DateTime fechaInicio, int Dias)
        {
            DateTime fechaFin = DateTime.Today.AddDays(Dias);
            return fechaFin;
        }
        
        public void RecControles(Control control)
        {
            //Recorremos con un ciclo for each cada control que hay en la colección Controls
            foreach (Control contHijo in control.Controls)
            {
                //Preguntamos si el control tiene uno o mas controles dentro del mismo con la propiedad 'HasChildren'
                //Si el control tiene 1 o más controles, entonces llamamos al procedimiento de forma recursiva, para que siga recorriendo los demás controles 
                if (contHijo.HasChildren)
                {
                    this.RecControles(contHijo);
                }
                if (contHijo is TextEdit)
                {

                    ((TextEdit)contHijo).EditValue = null;// string.Empty;
                }
                //Aqui va la lógica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo de todos los controles
                // Asignamos el Evento para los desplazamientos de los controles
            }
        }
        public void Habilitar(Control control,bool res)
        {
            //Recorremos con un ciclo for each cada control que hay en la colección Controls
            foreach (Control contHijo in control.Controls)
            {
                //Preguntamos si el control tiene uno o mas controles dentro del mismo con la propiedad 'HasChildren'
                //Si el control tiene 1 o más controles, entonces llamamos al procedimiento de forma recursiva, para que siga recorriendo los demás controles 
                if (contHijo.HasChildren)
                {
                    this.Habilitar(contHijo, res);
                }
                if (contHijo is TextEdit)
                {

                    ((TextEdit)contHijo).Enabled = res;// string.Empty;
                }
                //Aqui va la lógica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo de todos los controles
                // Asignamos el Evento para los desplazamientos de los controles
            }
        }

        public string FormatMoney(string importe)
        {
            return double.Parse(importe).ToString("###,###0.00");
        }

        public bool Numeros(System.Windows.Forms.KeyPressEventArgs e)
        {
            if (char.IsLetter(e.KeyChar) && e.KeyChar != 46 && e.KeyChar != 8)
            {
                e.Handled = true;
            }
            else
            {
                e.Handled = false;
            }
            if (e.KeyChar == (char)Keys.Enter)
            {
                e.Handled = true; //SendKeys.Send("{TAB}");
            }
            return e.Handled;
        }
        public  ArrayList  GetImpresoras()
        {
            ArrayList Imp = new ArrayList();
         for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
            {
                PrinterSettings a = new PrinterSettings();
                a.PrinterName = PrinterSettings.InstalledPrinters[i].ToString();
               // if (a.IsDefaultPrinter)
               // {
                Imp.Add(PrinterSettings.InstalledPrinters[i].ToString());
                   //return   PrinterSettings.InstalledPrinters[i].ToString();

                //}
            }
         return Imp;
        }

        #region Calculos
        public double Tot_dscto { get; set; }
        public double Importe_bruto { get; set; }
        public double Total { get; set; }
        public double Subtotal { get; set; }
        public double Porcent_igv { get; set; }
        public double Porcent_dscto_det { get; set; }
        public double Cantidad { get; set; }
        public double Precio { get; set; }
        public double Descuento { get; set; }
        public int Op_dscto { get; set; }
        public double setRedondear(double numero, int decimales)
        {
            return Math.Round(numero * Math.Pow(10, decimales)) / Math.Pow(10, decimales);
        }

        /// <summary>
        /// Se optiene el Sub Total A partir que se ingresa el total
        /// sin tomar en cuenta el descuento
        /// 
        /// </summary>
        /// <returns></returns>
        public string getSubTotal()
        {
            double res;
            if (this.Op_dscto == 1)
            {
                res = (double.Parse(this.getImporteBruto()) / (1 + (this.Descuento / 100))) / (1 + (this.Porcent_igv / 100));
            }
            else
            {
                res = (double.Parse(this.getImporteBruto()) - this.Descuento) / (1 + (this.Porcent_igv / 100));
            }
            //res = (double.Parse(getImporteBruto()) / (1 + (Descuento / 100))) / (1 + (Porcent_igv / 100));
            //double res = (double.Parse(getTotal())) / (1 + Porcent_igv / 100);
            return this.setRedondear(res, 2).ToString();
        }

        /// <summary>
        /// se calcula el total mediente el precio por la cantidad menos el descuento caso lo ubiese
        /// 
        /// </summary>
        /// <returns></returns>
        public String getTotal()
        {
            double res;
            if (this.Op_dscto == 1)
            {
                res = (double.Parse(this.getImporteBruto()) / (1 + (this.Descuento / 100)));
            }
            else
            {
                res = (double.Parse(this.getImporteBruto()) - this.Descuento);
            }
            //double res = (double.Parse(getImporteBruto()) / (1 + (Descuento / 100))) ;
            //double res = double.Parse(getImporteBruto())/double.Parse(getImporteBruto())* (Descuento/100);
            return this.setRedondear(res, 2).ToString();
        }

        /// <summary>
        /// Calculamos el Igv de la Linea del Producto
        /// </summary>
        /// <returns></returns>
        public String getValIgv()
        {
            //double res = (double.Parse(getImporteBruto()) / (1 + (Descuento / 100))) / (1 + (Porcent_igv / 100));
            double res = double.Parse(this.getSubTotal()) * (this.Porcent_igv / 100);
            return this.setRedondear(res, 2).ToString();
        }

        public String getValPrecio()
        {
            double res = 0;
            if (this.Cantidad > 0)
            {
                if (this.Op_dscto == 1)
                {
                    res = this.Total + (this.Total * (this.Descuento / 100)) / this.Cantidad;
                }
                else
                {
                    res = (this.Total + this.Descuento) / this.Cantidad;
                }
            }
            return this.setRedondear(res, 2).ToString();
        }

        public String getImporteBruto()
        {
            double res = (this.Precio * this.Cantidad);
            return this.setRedondear(res, 2).ToString();
        }
        #endregion
    }
}